// 配置路由地方  注意不要vue是小写
import Vue from 'vue'
import VueRouter from 'vue-router'
// 引入
import routes from './routes'
// 引入仓库
import store from '@/store'

// 使用插件
Vue.use(VueRouter)

// 保存一份VueRouter原型对象上的push方法,,申明式路由没有这个问题，编程时=式路由才存在这样的问题重写push和raplace方法
let originPush = VueRouter.prototype.push
let originRaplace = VueRouter.prototype.replace
VueRouter.prototype.push = function (location, res, err) {
    if (res && err) {
        originPush.call(this, location, res, err)
    } else {
        originPush.call(this, location, () => {}, () => {})
    }
}
VueRouter.prototype.replace = function (location, res, err) {
    if (res && err) {
        originRaplace.call(this, location, res, err)
    } else {
        originRaplace.call(this, location, () => {}, () => {})
    }
}
// 配置路由规则
let router = new VueRouter({
    routes,
    scrollBehavior(to, from, savedPosition) {
        // 始终滚动到顶部
        return {
            y: 0
        }
    }
})
// 暴露router
export default router;
router.beforeEach(async (to, from, next) => {
    let token = store.state.user.token
    let name = store.state.user.userInfo.name
    // 判断用户是否登录 如果登录了就会有token
    if (token) {
        if (to.path == '/login' || to.path == '/register') {
            // 如果登录了想去注册和登录页面就不放行
            next('/home')
        } else {
            // 登录了想去其他界面 判断是否有用户名
            if (name) {
                // 如果有用户名 就放行
                next()
            } else {
                try {
                    // 如果没有就发送请求获取成功后再放行
                    await store.dispatch("getUserInfo");
                    next()
                } catch (error) {
                    // 失败就是token过期了 重新登录获取
                    await store.dispatch("userLogin");
                    next('/login')
                }
            }

        }
    } else {
        // 未登录 不能点击进入交易相关的 支付中心 以及用户中心 不能放行next()
        let toPath = to.path
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            // 将跳转不过去的路径写入query里面 将来在登陆以后就直接跳转query路径  不用直接跳home   重定向
            next('/login?redirect=' + toPath)
        } else {
            next()
        }
    }
})